IBX - FB - model prace

Otázka od: hlas

16. 7. 2004 9:39

Zacinam novu aplikaciu.
Pouzivam D7, komponenty IBX, FB 1.0

Snazim sa pouzivat komponenty
- IBQuery na citanie
- IBQuery + IBupdateSql na zapis
- IBTransaction ako transakciu

Snazim sa ukladat zaznamy pomocou:

  dm.IBTransW.StartTransaction;
  try
    dm.QPer.post;
    dm.IBTransW.Commit;
  except
    on E:Exception do
    begin
      dm.IBTransW.Rollback;
      ModalResult:=mrNone;
      ShowMessage('Chyba');
    end;
  end;

Aj ked ma komponenta pre transakciu nastavene readcommited
a po post commitnem zaznam tak z druhej aplikacie tam zaznam nevidim.
Refresh tiez nepomaha. Az ked vyskocim a opat vojdem do aplikacie.

Kde robim chybu? Neda sa niekde najst ukazkovy model
prace s IBX a transakciami bez pouzitia DBNavigatora
s vlastnymi tlacitkami?

Odpovedá: Lebeda David

16. 7. 2004 11:08

> Aj ked ma komponenta pre transakciu nastavene readcommited
> a po post commitnem zaznam tak z druhej aplikacie tam zaznam nevidim.
> Refresh tiez nepomaha. Az ked vyskocim a opat vojdem do aplikacie.

Ahoj,

a druha aplikace je ta sama aplikace nebo jina? Pokud v prvni aplikaci provedes
Commit, coz zrejme opravdu delas, tak druha aplikace tyto zaznamy uvidi, kdyz
udela
select (tj. nikoli v ramci jiz otevreneho selectu). Prijde tedy na to, jak
delas refresh. Jestli
volanim query.Refresh, tak bacha, to je neco jineho. Je treba udelat Close,
Open a
pripade Locate. No a pri te prilezitosti lze samozrejme i zavrit a otevrit i
transakci.

David Lebeda


Odpovedá: Milan Tomes

16. 7. 2004 10:17

Ja pouzivam TIBDataSet a TIBSQL a nemam jediny problem. TIBTable a TIBQuery
jsem se velikym obloukem vyhnul...
Ukladani zaznamu provadim pres komponentu TIBSQL s tim, ze seskladam
dohromady cely dotaz (insert, update). Pokud potrebuji vybrat nejaka data
(select) tak pouziji TIBDataset.

S pozdravem

Milan Tomes

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of hlas
> Sent: Friday, July 16, 2004 10:22 AM
>
> Snazim sa pouzivat komponenty
> - IBQuery na citanie
> - IBQuery + IBupdateSql na zapis
> - IBTransaction ako transakciu


Odpovedá: hlas

16. 7. 2004 11:13


----- Original Message -----
From: "Milan Tomes"
> Ja pouzivam TIBDataSet a TIBSQL a nemam jediny problem. TIBTable a
TIBQuery
> jsem se velikym obloukem vyhnul...
> Ukladani zaznamu provadim pres komponentu TIBSQL s tim, ze seskladam
> dohromady cely dotaz (insert, update). Pokud potrebuji vybrat nejaka data
> (select) tak pouziji TIBDataset.


Takze ukladaniu cez TIBQuery.Post atd sa mam vyhnut?
Mam si robit svoje sql prikazy pre update, insert a
sam ich vykonavat?

Je na to nejaky dovod? Nefunguje to dobre?



Odpovedá: hlas

16. 7. 2004 11:43


----- Original Message -----
From: "Lebeda David" <david.lebeda@comarr.cz>
> a druha aplikace je ta sama aplikace nebo jina? Pokud v prvni aplikaci
provedes
> Commit, coz zrejme opravdu delas, tak druha aplikace tyto zaznamy uvidi,
kdyz udela
> select (tj. nikoli v ramci jiz otevreneho selectu). Prijde tedy na to, jak
delas refresh. Jestli
> volanim query.Refresh, tak bacha, to je neco jineho. Je treba udelat
Close, Open a
> pripade Locate. No a pri te prilezitosti lze samozrejme i zavrit a otevrit
i transakci.

ano problem bol v tom ze refresh nerobil refresh, alebo teda neviem co robil
ak dam close a open tak zmenu vidim. jedna sa o tu istu aplikaciu spustenu
2x
z toho isteho pocitaca. (Simulujem sietove spracovanie).

Teraz mam ale problem ze nedokazem editovat uz ulozeny zaznam.
Teda edit ide ale ak sa snazim ho ulozit (cez komponenty ibQuery a
ibUpdateSql
ako ibQuery.post atd...) tak mi to neulozi. Padne na hlaske "Update failed".


Odpovedá: Richard Kejval

16. 7. 2004 11:46

Ahoj

> > Ja pouzivam TIBDataSet a TIBSQL a nemam jediny problem. TIBTable a
> TIBQuery
> > jsem se velikym obloukem vyhnul...

neni zadny duvod proc nepouzivat TIBQuery, ale pouze na zobrazeni dat,
napr. do lookupu nebo na needitovatelne ciselniky..

S pozdravem
ing. Richard Kejval
mobil: 602477679
http://www.icsoftware.cz


Odpovedá: Milan Tomes

16. 7. 2004 13:23

No vzhledem k tomu, ze mas vyse popisovane problemy, tak bych se tomu
opravdu vyhnul. IMHO o komponente TIBTable a podobnych bylo napsano v teto
konferenci mnoho a mnoho. Kdyz jsem vytvarel nas firemni framework, tak jsem
pouzil opravdu jen komponenty TIBSQL a TIBDataset + TIBTransaction a
TIBDatabase, ale to je vsechno. Ve frameworku vse vytvarim dynamicky (tzn.
vcetne dotazu) - je to takovy O-R mapping, ale zatim jeste ne uplne dokonaly
 

S pozdravem

Milan Tomes

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of hlas
> Sent: Friday, July 16, 2004 11:28 AM
>
> Takze ukladaniu cez TIBQuery.Post atd sa mam vyhnut?
> Mam si robit svoje sql prikazy pre update, insert a
> sam ich vykonavat?
>
> Je na to nejaky dovod? Nefunguje to dobre?


Odpovedá: hlas

16. 7. 2004 14:04

----- Original Message -----
> No vzhledem k tomu, ze mas vyse popisovane problemy, tak bych se tomu
> opravdu vyhnul. IMHO o komponente TIBTable a podobnych bylo napsano v teto
> konferenci mnoho a mnoho. Kdyz jsem vytvarel nas firemni framework, tak
jsem
> pouzil opravdu jen komponenty TIBSQL a TIBDataset + TIBTransaction a
> TIBDatabase, ale to je vsechno. Ve frameworku vse vytvarim dynamicky (tzn.
> vcetne dotazu) - je to takovy O-R mapping, ale zatim jeste ne uplne
dokonaly


Vobec nepochybujem o tom, ze ak si clovek robi svoje sql prikazy(insert,
update, atd...)
tak ma aplikaciu podstatne viac pod kontrolou. Mne to teraz pise, ze update
failed a
ja vlastne neviem co sa deje. Keby som mal napisany svoj update a pustil ho
cez
TIBSql tak by to bolo asi o dost jasnejsie.

Ale zasa mi pripada ovela viac roboty ak nepozijem dbaware komponenty
a metody post, append, cancel atd. Bude ovela viac programovania,
co mi nepripada ako zanedbatelne.


Odpovedá: Lebeda David

16. 7. 2004 14:24

> Vobec nepochybujem o tom, ze ak si clovek robi svoje sql
> prikazy(insert, update, atd...) tak ma aplikaciu podstatne viac pod
> kontrolou. Mne to teraz pise, ze update failed a ja vlastne neviem co
> sa deje. Keby som mal napisany svoj update a pustil ho cez TIBSql tak
> by to bolo asi o dost jasnejsie.
>
> Ale zasa mi pripada ovela viac roboty ak nepozijem dbaware komponenty
> a metody post, append, cancel atd. Bude ovela viac programovania, co
> mi nepripada ako zanedbatelne.

Ahoj,

zkusenosti snad vsech, kteri psali nejakou netrivialni db aplikaci, jsou
takove, ze db-
aware komponenty a editace je zadelani na maler. Budes totiz pomerne casto
narazet
na ruzne nekdy drobne, nekdy mene drobne problemky a je otazka, zda vzdy najdes

nejakou okliku, jak je obejit. Jako jeden z moznych prikladu je prace s null
hodnotami.
Nevim, jestli treba s DBEditem dokazes ulozit prazdny retezec jako prazdny
retezec
nebo naopak jako NULL (nevim ted, ktery zpusob je pouzit) a proste radu se veci
se
Delphi pokusi udelat za tebe. Ovsem ne vzdy tak, jak bys zrovna potreboval a
ono se to
pak blbe obchazi.

Kdyz pouzivas vlastni SQL prikazy, je to sice nejaka prace navic, ale neni to
tak hrozne.
Muzes si sam resit konflikty pri pokusu o soucasnou editaci stejneho zaznamu
vice
uzivateli v siti, muzes celkove pracovat s databazi efektivneji z hlediska
transakci. FB
server nema rad dlouhe transakce, nejsou-li read-only, zatimco db-aware
komponenty
vyzaduji po celou dobu editace mit otevreny dataset a s nim i transakci. Nemuze
pak
jeden editujici, ktery si odskoci na pul dne do mesta a nezavre editacni okno,
zablokovat vsechny ostatni? Atd. Rozhodne jsem zastancem toho, db-aware
komponenty k editaci nepouzivat, zvlast ne v siti.

David Lebeda

Odpovedá: Milan Tomes

19. 7. 2004 6:26

Mas pravdu, ze to je vice programovani. Ale na druhou stranu - pokud si
vymyslis nejaky koncept frameworku dostatecne obecneho, tak to naprogramujes
jednou a mas vicemene pokoj. Ver mi, ze cas investovany prave do onoho
frameworku se do budoucna rozhodne vyplati - ja jsem ho vyvijel vice jak rok
(spolecne s aplikaci, ktera ho jako prvni pouzivala) a ted cely vyvojovy tym
uz jen posila drobne pripominky a vyuziva straslivou spoustu veci, o ktere
se nemusi vubec starat a ani o nich kolikrat nemaji "paru"  
IMHO udelat si zakladni podporu pro nacitani a ukladani dat je prace asi tak
na tyden  

S pozdravem

Milan Tomes


> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of hlas
> Sent: Friday, July 16, 2004 2:44 PM
>
> Vobec nepochybujem o tom, ze ak si clovek robi svoje sql prikazy(insert,
> update, atd...)
> tak ma aplikaciu podstatne viac pod kontrolou. Mne to teraz pise,
> ze update
> failed a
> ja vlastne neviem co sa deje. Keby som mal napisany svoj update a
> pustil ho
> cez
> TIBSql tak by to bolo asi o dost jasnejsie.
> Ale zasa mi pripada ovela viac roboty ak nepozijem dbaware komponenty
> a metody post, append, cancel atd. Bude ovela viac programovania,
> co mi nepripada ako zanedbatelne.


Odpovedá: hlas

19. 7. 2004 7:06

Tak som to zacal robit tak ako mi tu radite, bez pouzitia db-awaare
komponent.
Skladam si vlastne INSERTY a UPDATY sam. Fakt to nie je az take
narocne, ale moc si neviem predstavit pracu nad vazbou MASTER-DETAIL.

Sucasny stav mam takyto: Na 1. formulary je iba grid, napojeny cez IBQuery,
iba na zobrazenie dat. Ked stlacim tlacitko pridaj alebo oprav zobrazi sa mi
druhy
formular, kde su komponenty Edit. Ak sa jedna o upravu existujuceho zaznamu
doplnim
do nich uz existujuce hodnoty, necham uzivatela pracovat a po stlaceni
tlacitka OK
 si vygenerujem prikaz pre UPDATE alebo INSERT. Ten interpretujem cez
komponentu IBSQL. Takze v pohode.

Ale neviem co s vazbou MASTER-DETAIL. Na prvom formulary, budu 2 gridy
napojene cez IBQuery. To je v pohode. Ale na druhom, editacnom formulary,
ktory
sa zjavi ak uzivatel chce editovat alebo pridavat zaznamy budem mat vrch ako
vo
vyssie popisanom pripade, ale dole chcem mat opat grid s detailami k danemu
masterovi.
A tam v tom gride chcem nejako pracovat so zaznami detailnej tabulky.
Pocas prace tam mozu byt aj zaznamy stare, uz exisujuce detaily k danemu
masterovi a aj nove, ktore uzivatel prave pridava, pripadne edituje
uz stare. Toto nejako vizualne pekne udrzat v buducej podobe, opat vyskladat
sql prikaz a v ramci transakcie to cele interpretovat opat asi cez IBSQL
komponentu. No a toto mi uz nepripada moc jednoduche.
Inak nemam na mysli editaciu detailov priamo v gride ale budu tam opat
tlacitka
pridaj oprav odstrana a tie zmeny detailov sa budu diat na tretom formulary.

Toto sa mi zda ako dost krkolomna praca ak mam obist db-aware komoponenty.
Nad paradoxom to robim uplne v pohode. Dolne tabulky - detaily dam do stavu
cached updates, normalne tam uzivatel moze pracovat a na zaver s mastrom
sa urobi applyupdates. A JE TO.


Odpovedá: Milan Tomes

19. 7. 2004 7:25

Tak tohle me prave ted ceka...  
Myslenku mam takovouto - vytvorim predka formulare, ktery na sobe bude
obsahovat nejakou metodu na sparovani TDBRecordList a TdxMemData.
TDBRecordList je trida z naseho frameworku, ktera v sobe obsahuje mnozinu
objektu TDBRecord a TDBRecord je trida, ktera zabaluje praci s recordem v
databazi. Po zavolani metody LoadRecord hlavniho recordu na edit formulari
(predek ma jiz tento record jako vlastnost) se automaticky provede nacteni
podrizenych zaznamu do TDBRecordList a pote prekopirovani do TdxMemData. Nad
TdxMemData probiha normalni editace v gridu (TdxDBGrid) a pri ulozeni se
bude postupovat nasledovne:
Projdou se vsechny recordy v TDBRecordListu a hleda se odpovidajici zaznam
(pres primarni klic) v TdxMemData. Pokud neni nalezen je volana metoda
DeleteRecord tohoto recordu. Pokud je nalezen tak jsou prekopirovana data to
objektu a tento record ulozen metodou SaveRecord (da se nastavit, ze se
ulozi pouze pokud nastala zmena v datech a to jeste v ruznych urovnich).
Naposledy se prectou vsechny vety v TdxMemData, ktere nemaji vyplneny
primarni klic - vytvori se novy record, prekopiruji se data, ulozi se vazba
na nadrizeny zaznam a provede se ulozeni vety opet pomoci SaveRecord.
Jako prvni se samozrejme ulozi master zaznam a teprve pote se ukladaji
detaily. To vse pobezi v ramci jedine transakce, kterou si explicitne
odstartuji.

HTH

S pozdravem

Milan Tomes

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of hlas
> Sent: Monday, July 19, 2004 7:49 AM
>
> Ale neviem co s vazbou MASTER-DETAIL. Na prvom formulary, budu 2 gridy
> napojene cez IBQuery. To je v pohode. Ale na druhom, editacnom formulary,
> ktory
> sa zjavi ak uzivatel chce editovat alebo pridavat zaznamy budem
> mat vrch ako
> vo
> vyssie popisanom pripade, ale dole chcem mat opat grid s
> detailami k danemu
> masterovi.
> A tam v tom gride chcem nejako pracovat so zaznami detailnej tabulky.
> Pocas prace tam mozu byt aj zaznamy stare, uz exisujuce detaily k danemu
> masterovi a aj nove, ktore uzivatel prave pridava, pripadne edituje
> uz stare. Toto nejako vizualne pekne udrzat v buducej podobe,
> opat vyskladat
> sql prikaz a v ramci transakcie to cele interpretovat opat asi cez IBSQL
> komponentu. No a toto mi uz nepripada moc jednoduche.
> Inak nemam na mysli editaciu detailov priamo v gride ale budu tam opat
> tlacitka
> pridaj oprav odstrana a tie zmeny detailov sa budu diat na tretom
> formulary.


Odpovedá: Lebeda David

19. 7. 2004 7:29

> Tak som to zacal robit tak ako mi tu radite, bez pouzitia db-awaare
> komponent. Skladam si vlastne INSERTY a UPDATY sam. Fakt to nie je az
> take narocne, ale moc si neviem predstavit pracu nad vazbou
> MASTER-DETAIL.

Ahoj,

detaily k vybranemu masterovi je treba nacist do pametove tabulky, napr.
kbmMemTable, nad ni delat editaci podobne jako u mastera. No a pri ukladani se
nejprve ulozi master, zjistis jeho ID a pak je treba ulozit detaily. Zpusob
zalezi na
okolnostech:

1) Muzes nejprve vsechny stavajici detaily smazat a znovu zapsat to, co mas v
pametove tabulce. Je to jednoduche, ale ne vzdy to musi byt pouzitelne (pokud
by
vymazani melo spoustet nejake triggery a dalsi operace, muze byt nezadouci).

2) Nebo se pokusit porovnat stav databaze a memory tabulky (z hlediska ID) - a
pak to,
co nenajdes v pameti, smazat, co najdes, updatovat, a to, co je jen v pameti,
insertovat.

David Lebeda

Odpovedá: hlas

19. 7. 2004 7:49

Co to je to kbmMemTable, to je nejaka komponenta?
Kde to najdem?




----- Original Message -----
From: "Lebeda David"
> detaily k vybranemu masterovi je treba nacist do pametove tabulky, napr.
> kbmMemTable, nad ni delat editaci podobne jako u mastera. No a pri
ukladani se
> nejprve ulozi master, zjistis jeho ID a pak je treba ulozit detaily.
Zpusob zalezi na
> okolnostech:
>
> 1) Muzes nejprve vsechny stavajici detaily smazat a znovu zapsat to, co
mas v
> pametove tabulce. Je to jednoduche, ale ne vzdy to musi byt pouzitelne
(pokud by
> vymazani melo spoustet nejake triggery a dalsi operace, muze byt
nezadouci).
>
> 2) Nebo se pokusit porovnat stav databaze a memory tabulky (z hlediska
ID) - a pak to,
> co nenajdes v pameti, smazat, co najdes, updatovat, a to, co je jen v
pameti, insertovat.
>
> David Lebeda



Odpovedá: Lebeda David

19. 7. 2004 8:12

> Co to je to kbmMemTable, to je nejaka komponenta?

Presne tak.

http://www.components4developers.com. Kdyby ten odkaz nahodou
neplatil, tak to snadno najdes pres google. Pripadne RxMemoryData z
knihovny RxLib, ale nevim, zda tahle vec jeste zije (uz to nesleduji).

David Lebeda


Odpovedá: hlas

20. 7. 2004 8:38

A neexistuje nejaky sikovny sposob bez pouzitia cudzich komponent
a bez programovania novych komponent?

Co keby som "kesoval" ten detail pri editovani
do IBQuery alebo do IBTable, nastavil tam
cached updates na true aby to neslo do db a dialo
sa to iba u uzivatela v pamati a nakoniec by som zmeny
zapisal do db vlatnym prikazom cez IBSQL?

Aj tak sa mi to zda strasne, ze v drahom D7 ENT
musime takymito obklukami hladat sposob prace nad
tabulkami Master-deatail.Nie je mi jasne, co ten Borland
chce ponukat, ked nema ani vyriesenu pracu nad svojou
vlastnou databazou.


----- Original Message -----
From: "Lebeda David"
> > Co to je to kbmMemTable, to je nejaka komponenta?
>
> Presne tak.
>
> http://www.components4developers.com. Kdyby ten odkaz nahodou
> neplatil, tak to snadno najdes pres google. Pripadne RxMemoryData z
> knihovny RxLib, ale nevim, zda tahle vec jeste zije (uz to nesleduji).
>
> David Lebeda


Odpovedá: hlas

21. 7. 2004 7:42

Zacal som robit s tou kbmMemTable, vyzera to zaujimavo.
Celkom mi to funguje, len helpy su k nej asi platene, takze
iba skusam.

Mam ale este jednu otazku: Uvazujem nad dvoma sposobmi generovania
primarnych klucov z generatora. Prvy sposob je jasny,
pri vytvarani noveho zaznamu si zapytam nove cislo,
poznaju ho formulare, a toto potom pouzijem ked budem
zaznam resp. zaznamy ukladat.

Druhy sposob je pouzit triger before insert, to sa mi zda elegantnejsie
len neviem ako zistim hodnotu, ktory trigger nakoniec pouzil pri
masterovi, aby som mohol toto cislo pouzit ako
vazbu master-detail.


Odpovedá: Daniel Frantik

22. 7. 2004 10:25

> -----Original Message-----
> [mailto:delphi-l-owner@clexpert.cz] On Behalf Of hlas
> A neexistuje nejaky sikovny sposob bez pouzitia cudzich
> komponent a bez programovania novych komponent?
>
> Co keby som "kesoval" ten detail pri editovani
> do IBQuery alebo do IBTable, nastavil tam
> cached updates na true aby to neslo do db a dialo
> sa to iba u uzivatela v pamati a nakoniec by som zmeny
> zapisal do db vlatnym prikazom cez IBSQL?

Taky to jde delat tak, ze nejdriv musi uzivatel ulozit prazdneho mastera
(1. transakce) a pak k nemu pridavat deltaily (dalsi transakce) takze
nepotrebujes zadne cashovani v pameti apod... proste se k detailu chovas
jako k masterovi, jen nekde vis ID mastera ...

Danik
PS: proc kbMemTable kdyz mas ClientDataset ?


Odpovedá: Daniel Frantik

22. 7. 2004 10:17

> -----Original Message-----
> [mailto:delphi-l-owner@clexpert.cz] On Behalf Of hlas
> Mam ale este jednu otazku: Uvazujem nad dvoma sposobmi
> generovania primarnych klucov z generatora. Prvy sposob je
> jasny, pri vytvarani noveho zaznamu si zapytam nove cislo,
> poznaju ho formulare, a toto potom pouzijem ked budem zaznam
> resp. zaznamy ukladat.
> Druhy sposob je pouzit triger before insert, to sa mi zda
> elegantnejsie len neviem ako zistim hodnotu, ktory trigger
> nakoniec pouzil pri masterovi, aby som mohol toto cislo
> pouzit ako vazbu master-detail.

Osobne pouzivam generator ... (IDcka generuji hned na AfterInsert do
datasetu) - je to jednodussi, jen se trochu plytva sekvence (nemusi se
to vubec ulozit apod)... Nicmene u GUID ID to neni problem  
Zatim jsem nevidel funkcni verzi s triggerem (krome te co jsem uz psal:
Uloz_Mastera, Reload_Master_Dataset, Vytvor_Detail, Uloz_Detail)

Danik


Odpovedá: Milan Tomes

22. 7. 2004 10:30

No jo - jenze co budes delat v okamziku, kdy Ti projde zalozeni master
zaznamu, ale na detailu to zbuchne... To budes nejak explicitne osetrovat
pripadny rollback ??? To snad ne...   Krom jineho by melo byt zajisteno,
ze ten master zaznam neuvidi zadna jina transakce do doby nez bude kompletne
a korektne vytvoren...

S pozdravem

Milan Tomes

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Daniel Frantik
> Sent: Thursday, July 22, 2004 10:59 AM
>
> Taky to jde delat tak, ze nejdriv musi uzivatel ulozit prazdneho mastera
> (1. transakce) a pak k nemu pridavat deltaily (dalsi transakce) takze
> nepotrebujes zadne cashovani v pameti apod... proste se k detailu chovas
> jako k masterovi, jen nekde vis ID mastera ...


Odpovedá: Daniel Frantik

22. 7. 2004 11:37

Chce to trochu jiny pohled: Master obvykle muze existovat i bez detailu
... Pokud by tomu tak nebylo, nastupuje ta verze s pamatovanim na
klientovi a naslednym ulozenim vseho ... Ale to je podle meho minimum
pripadu ...

Nicmene verze prace v pameti (master i detaily - a pripadne i nekolik
masteru a nekolik detailu najednou) je uzivatelsky prijemnejsi, ale
programatorsky narocnejsi...

Danik
> -----Original Message-----
> From: delphi-l-owner@clexpert.cz
> No jo - jenze co budes delat v okamziku, kdy Ti projde
> zalozeni master zaznamu, ale na detailu to zbuchne... To
> budes nejak explicitne osetrovat pripadny rollback ??? To
> snad ne...   Krom jineho by melo byt zajisteno, ze ten
> master zaznam neuvidi zadna jina transakce do doby nez bude
> kompletne a korektne vytvoren...

> > [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Daniel Frantik
> > Taky to jde delat tak, ze nejdriv musi uzivatel ulozit prazdneho
> > mastera (1. transakce) a pak k nemu pridavat deltaily (dalsi
> > transakce) takze nepotrebujes zadne cashovani v pameti
> apod... proste
> > se k detailu chovas jako k masterovi, jen nekde vis ID mastera ...


Odpovedá: petr palicka

22. 7. 2004 11:38


Milan Tomes wrote:
> No jo - jenze co budes delat v okamziku, kdy Ti projde zalozeni master
> zaznamu, ale na detailu to zbuchne... To budes nejak explicitne osetrovat
> pripadny rollback ??? To snad ne...   Krom jineho by melo byt zajisteno,
> ze ten master zaznam neuvidi zadna jina transakce do doby nez bude kompletne
> a korektne vytvoren...

- spustim transakci
- zalozim vetu mastra
- zalozim vetu(y) detailu

dejme tomu, ze detail neprosel (stat by se to nemelo, ale obcas se stane
ledacos) a server mi vratil chybu.

- smazu master
- potvrdim transaskci

peca


Odpovedá: Milan Tomes

22. 7. 2004 11:40

Pokud to bude opravdu podle tohoto schematu:

- spustim transakci
- zalozim vetu mastra
- zalozim vetu(y) detailu

dejme tomu, ze detail neprosel (stat by se to nemelo, ale obcas se stane
ledacos) a server mi vratil chybu.

tak v ten okamzik to budu delat uplne jinak:

- na transakci zavolam rollback.

Nevim proc bych mel mazat master zaznam, kdyz presne kvuli tomuto existuji
transakce.

S pozdravem

Milan Tomes

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of petr palicka
> Sent: Thursday, July 22, 2004 11:31 AM
>
> Milan Tomes wrote:
> > No jo - jenze co budes delat v okamziku, kdy Ti projde zalozeni master
> > zaznamu, ale na detailu to zbuchne... To budes nejak explicitne
> osetrovat
> > pripadny rollback ??? To snad ne...   Krom jineho by melo
> byt zajisteno,
> > ze ten master zaznam neuvidi zadna jina transakce do doby nez
> bude kompletne
> > a korektne vytvoren...
>
> - spustim transakci
> - zalozim vetu mastra
> - zalozim vetu(y) detailu
>
> dejme tomu, ze detail neprosel (stat by se to nemelo, ale obcas se stane
> ledacos) a server mi vratil chybu.
>
> - smazu master
> - potvrdim transaskci


Odpovedá: Milan Tomes

22. 7. 2004 11:57

Ano - pokud muze existovat master zaznam bez detailu tak je to celkem v
poradku, ale v pripade, ze uzivatel ma k dispozici formular, na kterem
edituje najednou jak master tak i detail zaznam, tak pri ulozeni rozhodne
nebudu v samostatne transakci poustet master a v samostatne detail. To je
IMHO nesmysl a ve vysledku se to projevi jako napr. castecna ztrata dat nebo
nekonzistence...

S pozdravem

Milan Tomes

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Daniel Frantik
> Sent: Thursday, July 22, 2004 11:31 AM
>
> Chce to trochu jiny pohled: Master obvykle muze existovat i bez detailu
> ... Pokud by tomu tak nebylo, nastupuje ta verze s pamatovanim na
> klientovi a naslednym ulozenim vseho ... Ale to je podle meho minimum
> pripadu ...
>
> Nicmene verze prace v pameti (master i detaily - a pripadne i nekolik
> masteru a nekolik detailu najednou) je uzivatelsky prijemnejsi, ale
> programatorsky narocnejsi...
>
> Danik


Odpovedá: petr palicka

22. 7. 2004 12:41

> Nevim proc bych mel mazat master zaznam, kdyz presne kvuli tomuto existuji
> transakce.

To sice je pravda, ale konkretne na FB je rezie rollbacku oproti smazani
masteru commitu mnohem vetsi. Navic, uzivatel vetsinou ten detail ulozit
chce, jenom neco blbe zadal, takze popisovany postup byl opravdu vyjimecny.
Ja osobe delam rollback jen kdyz nevim kudy kam, podle meho je rollback
jakousi zachranou, pro reseni vyjimecneho stavu, nikoli nastroj k reseni
lenosti programatora.

Peca


Odpovedá: Milan Tomes

22. 7. 2004 13:12

Ale chyba pri ukladani dat je opravdu vyjimecny stav, ktery si nezasluhuje
nic jineho nez rollback... Alespon takto to vidim ja... Rozhodne nehodlam
delat silenosti typu
"pamatuj si ID vsech doposud ulozenych zaznamu a pri
chybe je smaz"... Co kdyz
nastane chyba pri tom vymazu ??? Rollback je IMHO
na toto presne urcen. Lenost ci pohodlnost programatora s tim nema vcelku co
delat.

S pozdravem

Milan Tomes


> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of petr palicka
> Sent: Thursday, July 22, 2004 1:22 PM
>
> > Nevim proc bych mel mazat master zaznam, kdyz presne kvuli
> tomuto existuji
> > transakce.
>
> To sice je pravda, ale konkretne na FB je rezie rollbacku oproti smazani
> masteru commitu mnohem vetsi. Navic, uzivatel vetsinou ten detail ulozit
> chce, jenom neco blbe zadal, takze popisovany postup byl opravdu
> vyjimecny.
> Ja osobe delam rollback jen kdyz nevim kudy kam, podle meho je rollback
> jakousi zachranou, pro reseni vyjimecneho stavu, nikoli nastroj k reseni
> lenosti programatora.


Odpovedá: Lstiburek Pavel

22. 7. 2004 13:10

> From: Milan Tomes [mailto:delphi@haida.cz]
> No jo - jenze co budes delat v okamziku, kdy Ti projde zalozeni master
> zaznamu, ale na detailu to zbuchne... To budes nejak
> explicitne osetrovat
> pripadny rollback ??? To snad ne...   Krom jineho by melo
> byt zajisteno,
> ze ten master zaznam neuvidi zadna jina transakce do doby nez
> bude kompletne
> a korektne vytvoren...
Ahoj.
jeden ze zpusobu je vytvaret master jako dve tabulky
vlastni ID (master-ID)a priznak platnosti zaznamu (neni nutne) a v dalsi
tabulce (master-property) jsou ostatni property zaznamu.

1. insert master-ID
2. insert/update/delete detailu (u)
3. insert master-property
4. update master ID (nastaveni platneho zaznamu)

V dobe mimo cinost aplikace se jen naleznou neplatne master ID a k nim
prirazene detaily a vymazou se.

Zpusob to neni idealni, ale docela dobre funguje a ma pomerne malou rezii ->
dobry vykon.
Pokud se dotazech pouziva "master-ID INNER JOIN master-property" (coz v musi ve
stavu po insertu platit a melo by byt pravidlem) tak vkladane zaznamy nejsou
videt.

Pavel


Odpovedá: Milan Tomes

22. 7. 2004 13:13

Priznam se k tomu, ze rozhodne nebudu menit filozofii prace s DB strojem.
Radsi vyuziji veskere funkce transakci (kvuli tomu jsem koneckoncu na DB
server presel) vcetne rollbacku, nez abych vymyslel jak zrychlit praci s
databazi o radove nekolik procent diky nepouziti rollbacku ve vyjimecnych
situacich. Levneji vyjde kdyz si zakaznik poridi rychlejsi server.
Mimochodem pokud vezmu procentualni podil rollbacku proti commitum tak mi
vyjde pomer 1:10000 a kvuli takto zanedbatelnemu poctu si nebudu komplikovat
zivot dalsimi klickami, ktere jsou dalsim potencialnim zdrojem problemu. U
rollbacku si mohu byt - alespon temer - jist, ze probehne, zatimco se v
zadnem pripade nemohu spolehnout na to, ze nejaky "rucni" rollback korektne
probehne. Argumentovali jste zvysenim rychlosti na serveru - a o kolik
procent zpomali ne zrovna mala rezie ukladani vsemoznych ID a dalsiho
haraburdi klienta ???

S pozdravem

Milan Tomes


> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Lstiburek Pavel
> Sent: Thursday, July 22, 2004 1:58 PM
>
> jeden ze zpusobu je vytvaret master jako dve tabulky
> vlastni ID (master-ID)a priznak platnosti zaznamu (neni nutne) a
> v dalsi tabulce (master-property) jsou ostatni property zaznamu.
>
> 1. insert master-ID
> 2. insert/update/delete detailu (u)
> 3. insert master-property
> 4. update master ID (nastaveni platneho zaznamu)
>
> V dobe mimo cinost aplikace se jen naleznou neplatne master ID a
> k nim prirazene detaily a vymazou se.
>
> Zpusob to neni idealni, ale docela dobre funguje a ma pomerne
> malou rezii -> dobry vykon.
> Pokud se dotazech pouziva "master-ID INNER JOIN master-property"
> (coz v musi ve stavu po insertu platit a melo by byt pravidlem)
> tak vkladane zaznamy nejsou videt.


Odpovedá: Lstiburek Pavel

22. 7. 2004 15:04

> From: petr palicka [mailto:palicka.petr@seznam.cz]
>
> - spustim transakci
> - zalozim vetu mastra
> - zalozim vetu(y) detailu
>
No, vetsina serveru ma v multi-user rezimu s timto pristupem trochu potize.
Dokud neskonci insert transakce, nelze nad stejnou tabulkou proveset dalsi
insert transakci a tak dalsi cekaji na ukonceni te prvni transakce.
Pavel


Odpovedá: petr palicka

23. 7. 2004 8:07

Lstiburek Pavel wrote:
>>From: petr palicka [mailto:palicka.petr@seznam.cz]
>>- spustim transakci
>>- zalozim vetu mastra
>>- zalozim vetu(y) detailu

> No, vetsina serveru ma v multi-user rezimu s timto pristupem trochu potize.
Dokud neskonci insert transakce, nelze nad stejnou tabulkou proveset dalsi
insert transakci a tak dalsi cekaji na ukonceni te prvni transakce.
> Pavel

Rec byla o FireBirdu a tam tento problem snad diky jeho MGA nenastava,
alespon jsme na to pri testovani sitoveho provozu nenarazili a urcite
jsme zkouseli soucasne vkladani i upravu udaju, kde je problem jen pokud
dva updatuji tentyz zaznam soucasne.

Peca